import re


# 01. 使用 re 的 findall() 找到所有符合模式的字符串
def exe_first():
    text = '小明身高:178，体重: 168，学号: 123456，密码: 9527'
    # r: 模式，表示原始字符，如果出现反编译字符，按原文处理
    print('01. 找到所有符合模式的字符串: ', re.findall(r'123456', text))


# 02. 使用 re 的 findall() 找到所有符合模式的字符串
def exe_second():
    text = '小明身高:178，体重: 168，学号: 123456，密码: 9527wefsda'
    print('02-1. 找到所有 单个的数字: ', re.findall(r'\d', text))
    print('02-2. 找到所有 不是数字的字符: ', re.findall(r'\D', text))
    print('02-3. 找到所有 非标点的其他字符: ', re.findall(r'\w', text))
    print('02-4. 找到所有 1-5 的数字: ', re.findall(r'[1-5]', text))
    print('02-5. 找到所有 a-z 的英文字符: ', re.findall(r'[a-z]', text))
    print('02-6. 找到所有 特定字符: ', re.findall(r'[高重号]', text))


# 03. \d+: 表示数字可以出现 1-n 次，所以 178 等，都符合它的要求
def exe_third():
    text = '小明身高:178，体重: 168，学号: 123456，密码: 9527wefsda'
    print('03. 找到所有 单个的数字: ', re.findall(r'\d+', text))


# 04. 找出座机号码
# ['1', '2']: 表示中括号中的字符，出现任意一次就行
# {1, n}：表示花括号中，符合要求的字符，输出 1-n 个
def exe_fourth():
    text = '麦叔电话是18812345678，他还有一个电话号码是18887654321，他爱好的数字是01234567891, 他的座机是: 0571-52152166'
    print('04. 找出座机号码: ', re.findall(r'\d{3,4}-\d{7,8}', text))


# 05. 找出手机号码或座机号码
# ['1', '2']: 表示中括号中的字符，出现任意一次就行
# {1, n}：表示花括号中，符合要求的字符，输出 1-n 个
def exe_five():
    text = '麦叔电话是: 18812345678，他还有一个电话号码是: 18887654321，他爱好的数字是: 01234567891, 他的座机是: 0571-52152166'
    print('05. 找出手机号码或座机号码: ', re.findall(r'\d{3,4}-\d{7,8}|1\d{10}', text))


# 06. 在句子开头的手机号码,或座机
# ^: 表示一定要在句子的开头才行。这时候只有18812345678能匹配上
def exe_six():
    text = '18812345678，他还有一个电话号码是: 18887654321，他爱好的数字是: 01234567891, 他的座机是: 0571-52152166'
    print('06. 找出手机号码或座机号码: ', re.findall(r'^1\d{1,10}|^\d{3,4}-\d{7,8}', text))


# 07. 找出形如 barbar,dardar 的前后三个字母重复的字符串
# \w{3}: 表示 3 个字符，放在小括号中 (\w{3}) 就成为一个分组，而后面的 (\1) 表示它里面的内容和第 1 个括号里的内容必须相同，其中的 1 就表示第 1 个括号，也就是说 3 个字符要重复出现两次。
def exe_seven():
    text = 'barbar carcar harhel'
    print('07. 前后三个字母重复的字符串: ', re.findall(r'(\w{3})(\1)', text))


# 08. re 里面的常用方法
# search(): 找到其中一个
# match(): 只返回一个，从头开始匹配
# findall()：返回字符串
# finditer(): 返回 Match 迭代器
def exe_re_method():
    text = '18812345678，他还有一个电话号码是: 18887654321，他爱好的数字是: 01234567891, 他的座机是: 0571-52152166'
    search_charset = re.search(r'\d{3,4}-\d{7,8}', text)
    print('08-1. 找出手机号码或座机号码: ', search_charset.group())
    print('08-2. 找出手机号码或座机号码: ', search_charset.groups())

    search_charset = re.search(r'\d{3,4}-(\d{7,8})', text)
    print('08-1. 找出手机号码或座机号码: ', search_charset.group())
    print('08-2. 找出手机号码或座机号码: ', search_charset.groups())

    search_charset = re.search(r'(\d{3,4})-(\d{7,8})', text)
    print('08-1. 找出手机号码或座机号码: ', search_charset.group())
    print('08-2. 找出手机号码或座机号码: ', search_charset.groups())


# 09. sub 替换方法
def exe_sub():
    text = '18812345678，他还有一个电话号码是: 18887654321，他爱好的数字是: 01234567891, 他的座机是: 0571-52152166'
    charset = re.sub(r'\d{3,4}-\d{7,8}', '0351-7998608', text)
    charset_n = re.subn(r'\d{3,4}-\d{7,8}', '0351-7998608', text)
    print('09-1. 替换后的字符串为: ', charset)
    print('09-2. 替换后的字符串为: ', charset_n)


if __name__ == "__main__":
    # 01. 找到固定的字符串
    # exe_first()

    # 02. 某一类字符
    # exe_second()

    # 03. 重复某一类字符
    # exe_third()

    # 04. 组合
    # exe_fourth()

    # 05. 多种情况
    # exe_five()

    # 06. 在句子开头的手机号码,或座机
    # exe_six()

    # 07. 找出形如 barbar,dardar 的前后三个字母重复的字符串
    # exe_seven()

    # 08. re 模块儿的方法
    # exe_re_method()

    # 09. sub 方法：替换
    exe_sub()

    pass
